<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
// new运算符；1.执行函数；2.自动创建一个空对象；  3.把创建的对象指向另外一个对象；
// 4.把空对象和函数里的this 衔接起来；(this指向实例化对象) 5.隐式返还this；

// function test(){
//     console.log("test..");
// }
// test();
// new test();
//简化工厂模式；---->构造函数；
// 1.约定俗成：首字符大写；
// 2.属性放在构造函数；方法放在原型；
// let Tab = {}
function Tab(){
    // let obj = {};--->this;
    this.name = "张三";
    // this.hobby = function(){
    //     console.log("篮球");
    // }
    // return obj;
}
Tab.prototype.psFor = function(){
    console.log("psFor...");
}
Tab.prototype.hobby = function(){
    console.log("hobby...",this.name);
}
//每个原型上都有一个预定义属性； constructor---》构造函数；
// 覆盖原本 constructor属性；
// Tab.prototype = {
//     constructor:Tab,
//     psFor(){
//         console.log("psFor...");
//     },
//     hobby(){
//         console.log("hobby...",this.name);
//     }
// }


// let str = "1212fdsf";
// // let str = new String("fdsfdsa");
// if(str.constructor===String){
//     console.log("字符串")
// }else{
//     console.log("不是");
// }



// Tab();
// let tab1 = new Tab();
// console.log(tab1.constructor===Tab);

// console.log(tab1.__proto__===Tab.prototype); 
// console.log(tab1.name);
// // console.log();
// tab1.hobby();
// let tab2 = new Tab("张三","lisi");
// // console.log(tab1.psFor===tab2.psFor);
// tab2.hobby();

//仿写new 运算符；
function myNew(constructor,...arg){
    let obj = {};
    constructor.call(obj,...arg);
    obj.__proto__ = constructor.prototype;
    return obj;
}

let tab1 = myNew(Tab);
// console.log(tab1.name)
tab1.psFor();





</script>
</html>